package com.note.feng.leetcode.algorithms.easy.three;

import java.util.ArrayList;
import java.util.List;

public class ThreeHundredFortyFive {

    /**
     * 345 反转字符串中的元音字母
     * 给你一个字符串 s ，仅反转字符串中的所有元音字母，并返回结果字符串。
     *
     * 元音字母包括 'a'、'e'、'i'、'o'、'u'，且可能以大小写两种形式出现。
     *
     * 示例 1：
     *
     * 输入：s = "hello"
     * 输出："holle"
     * 示例 2：
     *
     * 输入：s = "leetcode"
     * 输出："leotcede"
     *  
     * 提示：
     *
     * 1 <= s.length <= 3 * 105
     * s 由 可打印的 ASCII 字符组成
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/reverse-vowels-of-a-string
     */
    /**
     *解法：双指针
     * 左右指针分别指向字符串的两端，左指针向右移动，直到指向元音字母，
     * 右指针左移，直到指向元音字母，若左指针在右指针的左面，交换两个指针的值
     * 注意：
     * 1.左指针的右边界
     * 2.右指针的左边界
     * 3.左指针在右指针的左面，才交换，交换后，左指针右移，右指针左移
     * @param s
     * @return
     */
    public String reverseVowels(String s) {
        String list = "aeiouAEIOU";
        char [] chars = s.toCharArray();
        int len = s.length();
        int left = 0, right = len - 1;
        while (left < right){
            while (left < len && list.indexOf(chars[left]) == -1){
                left ++;
            }
            while (right >= 0 && list.indexOf(chars[right]) == -1){
                right --;
            }
            if(left < right){
                char c = chars[left];
                chars[left] = chars[right];
                chars[right] = c;
                left ++;
                right --;
            }
        }
        return chars.toString();
    }
}
